package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import com.itheima.domain.*;
import com.itheima.dto.OrdersDto;
import com.itheima.service.AddressBookService;
import com.itheima.service.OrderDetailService;
import com.itheima.service.OrdersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RestController
@RequestMapping("/order")
@SuppressWarnings("all")
public class OrderController {


    @Autowired
    private OrdersService ordersService;

    @Autowired
    private AddressBookService addressBookService;
    @Autowired
    private OrderDetailService orderDetailService;


    @PostMapping("/submit")
    public R<String> submit(@RequestBody Orders orders) {
        log.info("订单数据：{}", orders);
        ordersService.submit(orders);
        return R.success("下单成功");
    }

    //后台订单信息分页查询
    @GetMapping("/page")//方法参数中接收网页中传输过来的参数
    public R<Page> page(Integer page, Integer pageSize, Long number, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime beginTime, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
        //配置一个分页构造器
        Page<Orders> pageInfo = new Page<>(page, pageSize);
        //构造一个订单条件构造器
        LambdaQueryWrapper<Orders> lqw = new LambdaQueryWrapper<>();
        //判断网页中的订单号是否为空，不为空再进行条件查询
        lqw.eq(number != null, Orders::getNumber, number);
        //判断网页中的开始时间是否为空，不为空再进行条件查询
        lqw.ge(beginTime != null, Orders::getOrderTime, beginTime);
        //判断网页中的结束时间是否为空，不为空再进行条件查询
        lqw.le(endTime != null, Orders::getOrderTime, endTime);
        //将符合条件的数据以及分页配置构造器自动生成的分页数据展示到页面
        ordersService.page(pageInfo, lqw);

        /*
         *配置一个dto类型的分页构造器
         * 将pageInfo中的数据拷贝到pagedto中，因为你要给userName赋值，展示到页面，orders封装类没有该字段，
         * 无法满足条件，使用dto扩展出该字段进行赋值
         * */
        Page<OrdersDto> pagedto = new Page<>();
        BeanUtils.copyProperties(pageInfo, pagedto, "records");
        List<Orders> records = pageInfo.getRecords();
        List<OrdersDto> collect = records.stream().map(itme -> {
            OrdersDto ordersDto = new OrdersDto();
            BeanUtils.copyProperties(itme, ordersDto);
            String consignee = itme.getConsignee();
            ordersDto.setUserName(consignee);
            return ordersDto;
        }).collect(Collectors.toList());
        pagedto.setRecords(collect);
        return R.success(pagedto);
    }


    //客户端订单信息分页查询
    @GetMapping("/userPage")
    public R<Page> userPage(Integer page, Integer pageSize) {
        Page<Orders> pageinfo = new Page<>(page, pageSize);
        LambdaQueryWrapper<Orders> lqw = new LambdaQueryWrapper<>();
        //根据当前的登录用户id获取到当前登陆用户的订单信息
        lqw.eq(Orders::getUserId, BaseContext.getCurrentId());
        //将符合的条件的信息分页显示到页面
        ordersService.page(pageinfo, lqw);

        /*
        * 页面展示要求当前orders无法满足，扩展dto。
        * 将orders中所有的属性拷贝给ordersDto，现在可以扩展属性了
        * 获取地址Id根据地址Id获取到地址对象，根据地址对象获取到地址名称，给oredersDto设置进去
        *
        *
        * 获取当前订单ID，根据当前订单Id去订单明细表中查询对应的订单信息
        * 将订单明细信息调用orderDetailService 接口方法添加进去。（订单明细是多条数据，使用list）
        * 将查询出来的订单明细集合给ordersDto中的setOrderDetails（订单与订单明细表）集合设置进去、
        * 将装有所有订单信息以及订单详情信息的ordersDto返回
        * 将修改完所有的分页数据使用一个集合接收并且返回 collect
        * 将这些分页数据给pagedto泛型为<ordersDto>中的records（分页所有数据）进行赋值
        * */
        Page<OrdersDto> pagedto = new Page<>();
        BeanUtils.copyProperties(pageinfo, pagedto, "records");
        List<Orders> records = pageinfo.getRecords();
        List<OrdersDto> collect = records.stream().map(itme -> {
            OrdersDto ordersDto = new OrdersDto();
            BeanUtils.copyProperties(itme, ordersDto);
            Long addressBookId = itme.getAddressBookId();
            AddressBook addressBook = addressBookService.getById(addressBookId);
            if (addressBook != null) {
                String detail = addressBook.getDetail();
                ordersDto.setAddress(detail);
            }
            Long id = itme.getId();
            LambdaQueryWrapper<OrderDetail> olqw = new LambdaQueryWrapper<>();
            olqw.eq(OrderDetail::getOrderId, id);
            List<OrderDetail> list = orderDetailService.list(olqw);
            ordersDto.setOrderDetails(list);
            return ordersDto;
        }).collect(Collectors.toList());
        pagedto.setRecords(collect);
        return R.success(pagedto);
    }
}
